//
//  JJMainViewController.swift
//  Weibo
//
//  Created by Adobe on 15/9/27.
//  Copyright © 2015年 龚巨军. All rights reserved.
//

import UIKit

class JJMainController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        addChildViewControllers()
        
        
    }
    
    
    
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        tabBar.addSubview(composeButton)
        
        let width = UIScreen.mainScreen().bounds.width / CGFloat(childViewControllers.count)
        
        let rect = CGRect(origin: CGPointZero, size: CGSize(width: width, height: 49))
        
        
        
        composeButton.frame = CGRectOffset(rect, width * 2, 0)
        
        JJLog("\(childViewControllers.count)")
        
    }
    
    
    
    private func addChildViewControllers() {
        
        // 1.添加子控制器
        do{
            // 处理正常逻辑
            // 1.1拿到json文件的路径
            let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)!
            // 1.2根据路径创建NSData
            let data = NSData(contentsOfFile: path)!
            // 1.3根据NSData创建数组
            // 如果写try, 那么就必须写上do catch来处理, 否则编译不通过
            // 如果写try!, 强制try, 可以不写do catch, 但是如果抛出异常, 程序会崩溃
            let dictArr = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
            // 1.4便利数组创建控制器
            //            print(dictArr)
            // 在Swift中如果要便利一个数组, 必须明确是数组类型
            for dict in dictArr as! [[String: AnyObject]]
            {
                addChildViewController(dict["vcName"] as! String, imageName: dict["imageName"] as! String , title: dict["title"] as! String)
            }
        }catch
        {
            // 如果抛出异常就会来到catch
            
            addChildViewController("JJHomeViewController", imageName: "tabbar_home", title: "首页")
            addChildViewController("JJMessageViewController", imageName: "tabbar_message_center", title: "消息")
            
            addChildViewController("JJNullViewController", imageName: "", title: "")
            addChildViewController("JJDiscoverViewController", imageName: "tabbar_discover", title: "广场")
            addChildViewController("JJProfileViewController", imageName: "tabbar_profile", title: "我")
            
        }
    }
    
    // MARK: - 内部控制方法
    private  func addChildViewController(vcName: String, imageName: String, title: String) {
        
        // 0.动态获取命名空间
        let nsp = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
        // 注意: 在Swift中, 如果想通过一个字符串创建一个类, 那么必须加上命名空间, 否则创建出来是nil
         let cls: AnyClass =  NSClassFromString(nsp + "." + vcName)!
        // AnyClass并不知道具体的类型, 所以需要将他转换为已知的类型, 然后再调用init()方法创建对象
        let vc = (cls as! UIViewController.Type).init()
        
        
        // 1设置图片和标题
        vc.tabBarItem.image = UIImage(named: imageName)
        vc.tabBarItem.selectedImage =  UIImage(named: imageName + "_highlighted")
        // 系统会自动从内至外的设置
        vc.title = title
        
        // 2.包装一个Nav
        let nav = UINavigationController()
        nav.addChildViewController(vc)
        
        // 3.将Nav添加为TabBarVC的子控制器
        addChildViewController(nav)
        
        
    }
    
    // MARK: - 懒加载
    // 被private修饰的方法或者属性只能被当前类和当前文件访问
    // 也就是说如果想访问一个private修饰的东西, 要么是同一个类, 要么在同一个文件中
    private lazy var composeButton:UIButton = {
        let btn  = UIButton()
        
        btn.setImage(UIImage(named: "tabbar_compose_icon_add"), forState: UIControlState.Normal)
        
        btn.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), forState:UIControlState.Highlighted)
        
        btn.setBackgroundImage(UIImage(named: "tabbar_compose_button"), forState: UIControlState.Normal)
        btn.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), forState: UIControlState.Highlighted)
        
        btn.addTarget(self, action: Selector("composeBtnClick"), forControlEvents: UIControlEvents.TouchUpInside)
        return btn
        
        }()
    
    
    /*
    监听按钮点击的方法, 不能是private的, 因为点击事件是通过运行循环传递过来的
    OC是基于运行时的, 调用方法都是在运行时动态查找和派发的
    Swift为了提高性能, 所有的方法调用都是在编译时就已经确定的, 也就是说不会在运行时动态的去查找和派发
    */
    @objc  private  func composeBtnClick()
    {
        JJLog(__FUNCTION__)
    }
}
